package prjtgl.metier.comptes.profil_utilisateur.poste;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import prjtgl.metier.Application;
import prjtgl.metier.comptes.Membre;
import prjtgl.metier.comptes.profil_societe.Societe;
import prjtgl.metier.comptes.profil_utilisateur.DomaineExpertise;
import prjtgl.metier.comptes.profil_utilisateur.Profil;

/**
 * Experience professionnelle d'un membre
 *
 * @author Lucie
 */
@Entity
@Table(name = "experience")
public class Experience implements Serializable {

	private long id;
	/**
	 * Date de debut de l'experience
	 */
	private Date dateDebut;
	/**
	 * Date de fin de l'experience
	 */
	private Date dateFin;
	/**
	 * VRAI si l'experience est en cours, FAUX si elle est terminee
	 */
	private boolean enCours;
	/**
	 * Description de l'experience
	 */
	private String description;
	/**
	 * Membre qui a effectue cette experience
	 */
	private Membre membre;
	/**
	 * Profil effectue lors de cette experience
	 */
	private Profil profil;
	/**
	 * Societe ou s'est deroulee l'experience
	 */
	private Societe societe;
	/**
	 * Poste occupe
	 */
	private Poste poste;
	/**
	 * Direction occupee
	 */
	private Direction direction;
	private static DateFormat dateFormat;

	static {
		dateFormat = new SimpleDateFormat("dd.MM.yyyy");
	}
	/**
	 * Liste des domaines d'expertise
	 */
	private List<DomaineExpertise> domaines;

	/**
	 * Retourne la société sous forme de String
	 *
	 * @return Société sous forme de chaine de caractères
	 */
	public String obtenirSociete() {
		if (societe == null) {
			return "";
		}
		return societe.getNom();
	}

	/**
	 * Retourne le profil de l'experience
	 *
	 * @return Profil sous forme de chaine de caractères
	 */
	public String obtenirProfil() {
		if (profil == null) {
			return "";
		}
		return profil.getIntitule();
	}

	public String obtenirDateDebut() {
		if (dateDebut == null) {
			return "aucune date";
		}
		return dateFormat.format(dateDebut);
	}

	public String obtenirDateFin() {
		if (dateFin == null) {
			//return "aucune date";
                   // java.sql.Timestamp timestamp = null;
                    String format = "dd.MM.yy";
                    java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(format);
                    java.util.Date date = new java.util.Date();
                   // return formater.format(date);
                    return dateFormat.format(date);
                  //  return date.toString();
                    //    return "maintenant";
		}
		return dateFormat.format(dateFin);
	}
        
       
	public String obtenirDescription() {
		return description == null ? "" : description;
	}

	public String obtenirPoste() {
		return poste == null ? "" : poste.getIntitule();
	}

	public String obtenirDirection() {
		return direction == null ? "" : direction.getDescription();
	}

	public String obtenirDomaines() {
		String ret = "";
		String ponct = "";
		if (domaines != null) {
			for (DomaineExpertise d : domaines) {
				ret += ponct + d.getIntitule();
				ponct = ", ";
			}
		}
		return ret;
	}

	/**
	 * Modifier une experience
	 *
	 * @param dateDebut Date de debut de l'experience
	 * @param dateFin Date de fin de l'experience
	 * @param enCours VRAI si l'experience est en cours, FAUX si elle est
	 * terminee
	 * @param description Description de l'experience
	 */
	public void editer(Date dateDebut, Date dateFin, Boolean enCours, String description) {
		this.dateDebut=dateDebut;
                this.dateFin=dateFin;
                this.enCours=enCours;
                this.description=description;
                
	}

	/**
	 * Modifier l'intilule du poste occupe
	 *
	 * @param intitule Intitule du poste
	 */
	public void editerPoste(String intitule) {
		this.poste.setIntitule(intitule);
	}

	/**
	 * Editer le nom de la societe
	 *
	 * @param nomSociete Nom de la societe
	 */
	public void editerSociete(String nomSociete) {
		this.societe.setNom(nomSociete);
	}

	/**
	 * Ajouter un domaine d'expertise
	 *
	 * @param intitule Intitule du domaine d'expertise
	 */
	public void ajouterDomaineExpertise(String intitule) {
		this.domaines.add(Application.getInstance().rechercherDomainesExpertise(intitule));
	}

	/**
	 * Supprimer un domaine d'expertise
	 *
	 * @param intitule Intitule du domaine
	 */
	public void retirerDomaineExpertise(String intitule) {
		this.domaines.remove(Application.getInstance().rechercherDomainesExpertise(intitule));
	}

	/**
	 * Editer la description de la direction
	 *
	 * @param description Description de la direction
	 */
	public void editerDirection(String description) {
		this.direction.setDescription(description);
	}

	/**
	 * Retourne l'ID BDD
	 *
	 * @return ID BDD
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	public long getId() {
		return id;
	}

	/**
	 * Mutateur de l'ID BDD
	 *
	 * @param id Nouvel ID BDD
	 */
	public void setId(long id) {
		this.id = id;
	}

	/**
	 * Retourne la date de debut de l'experience
	 *
	 * @return Date de debut
	 */
	@Column(name = "date_debut")
	@Temporal(javax.persistence.TemporalType.TIMESTAMP)
	public Date getDateDebut() {
		return dateDebut;
	}

	/**
	 * Mutateur de la date de debut de l'experience
	 *
	 * @param dateDebut Nouvelle date de debut
	 */
	public void setDateDebut(Date dateDebut) {
		this.dateDebut = dateDebut;
	}

	/**
	 * Retourne la date de fin de l'experience
	 *
	 * @return Date de fin
	 */
	@Column(name = "date_fin")
	@Temporal(javax.persistence.TemporalType.DATE)
	public Date getDateFin() {
		return dateFin;
	}

	/**
	 * Mutateur de la date de fin de l'experience
	 *
	 * @param dateFin Nouvelle date de fin
	 */
	public void setDateFin(Date dateFin) {
		this.dateFin = dateFin;
	}

	/**
	 * Indique si l'experience est toujours en cours
	 *
	 * @return VRAI si l'experience est en cours, FAUX sinon
	 */
	@Column(name = "en_cours")
	public boolean isEnCours() {
		return enCours;
	}

	/**
	 * Mutateur de l'etat de l'experience (en cours ou non)
	 *
	 * @param enCours VRAI si l'experience est en cours, FAUX sinon
	 */
	public void setEnCours(boolean enCours) {
		this.enCours = enCours;
	}

	/**
	 * Retourne la description de l'experience
	 *
	 * @return Description
	 */
	@Column(name = "description")
	public String getDescription() {
		return description;
	}

	/**
	 * Mutateur de la description de l'experience
	 *
	 * @param description Nouvelle description
	 */
	public void setDescription(String description) {
		this.description = description;
	}

	/**
	 * Retourne le membre associe a cette experience
	 *
	 * @return Membre
	 */
	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_membre")
	public Membre getMembre() {
		return membre;
	}

	/**
	 * Mutateur du membre associe a cette experience
	 *
	 * @param membre Nouveau membre
	 */
	public void setMembre(Membre membre) {
		this.membre = membre;
	}

	/**
	 * Retourne le profil exerce durant l'experience
	 *
	 * @return Profil exerce
	 */
	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_profil")
	public Profil getProfil() {
		return profil;
	}

	/**
	 * Mutateur du profil exerce durant l'experience
	 *
	 * @param profil Nouveau profil
	 */
	public void setProfil(Profil profil) {
		this.profil = profil;
	}

	/**
	 * Retourne la societe dans laquelle s'est deroulee l'experience
	 *
	 * @return Societe
	 */
	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_societe")
	public Societe getSociete() {
		return societe;
	}

	/**
	 * Mutateur de la societe dans laquelle s'est deroulee l'experience
	 *
	 * @param societe Nouvelle societe
	 */
	public void setSociete(Societe societe) {
		this.societe = societe;
	}

	/**
	 * Retourne le poste associe a l'experience
	 *
	 * @return Poste
	 */
	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_poste")
	public Poste getPoste() {
		return poste;
	}

	/**
	 * Mutateur du poste associe a l'experience
	 *
	 * @param poste Nouveau poste
	 */
	public void setPoste(Poste poste) {
		this.poste = poste;
	}

	/**
	 * Retourne la direction associee a l'experience
	 *
	 * @return Direction
	 */
	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_direction")
	public Direction getDirection() {
		return direction;
	}

	/**
	 * Mutateur de la direction associee a l'experience
	 *
	 * @param direction Nouvelle direction
	 */
	public void setDirection(Direction direction) {
		this.direction = direction;
	}

	@ManyToMany(cascade= CascadeType.ALL, fetch= FetchType.LAZY)
	@JoinTable(name="domaine_experience",
			joinColumns={@JoinColumn(name="id_experience")},
			inverseJoinColumns={@JoinColumn(name="id_domaine")})
	public List<DomaineExpertise> getDomaines() {
		return domaines;
	}

	public void setDomaines(List<DomaineExpertise> domaines) {
		this.domaines = domaines;
	}
	
}
